From 421a8198af5c47f49868871157bbf87dc531c6ba Mon Sep 17 00:00:00 2001 From: "cl349@freefall.cl.cam.ac.uk" Date: Fri, 22 Oct 2004 13:52:51 +0000 Subject: [PATCH] bitkeeper revision 1.1159.129.1 (417910b3OLNctbN0leCgFvn5gSulDQ) Fix control channel reconnect after xend restart. --- tools/python/xen/xend/XendConsole.py | 5 +++-- tools/python/xen/xend/XendDomainInfo.py | 3 ++- tools/python/xen/xend/server/SrvDaemon.py | 5 +++-- tools/python/xen/xend/server/channel.py | 12 ++++++------ tools/python/xen/xend/server/console.py | 10 ++++++---- tools/python/xen/xend/server/controller.py | 10 ++++++---- 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/tools/python/xen/xend/XendConsole.py b/tools/python/xen/xend/XendConsole.py index 6825dc5baa..ea79645be9 100644 --- a/tools/python/xen/xend/XendConsole.py +++ b/tools/python/xen/xend/XendConsole.py @@ -32,8 +32,9 @@ class XendConsole: def consoles(self): return daemon.get_consoles() - def console_create(self, dom, console_port=None): - consinfo = daemon.console_create(dom, console_port=console_port) + def console_create(self, dom, console_port=None, remote_port=0): + consinfo = daemon.console_create(dom, console_port=console_port, + remote_port=remote_port) return consinfo def console_get(self, id): diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 031b1a4143..18d4d5945c 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -733,7 +733,8 @@ class XendDomainInfo: if self.console: self.console.registerChannel() else: - self.console = xendConsole.console_create(self.dom, console_port=self.console_port) + self.console = xendConsole.console_create( + self.dom, console_port=self.console_port, remote_port=1) self.build_domain(ostype, kernel, ramdisk, cmdline) self.image = kernel self.ramdisk = ramdisk diff --git a/tools/python/xen/xend/server/SrvDaemon.py b/tools/python/xen/xend/server/SrvDaemon.py index c6c4282eee..42b8a8ca39 100644 --- a/tools/python/xen/xend/server/SrvDaemon.py +++ b/tools/python/xen/xend/server/SrvDaemon.py @@ -669,12 +669,13 @@ class Daemon: def netif_get(self, dom): return self.netifCF.getControllerByDom(dom) - def console_create(self, dom, console_port=None): + def console_create(self, dom, console_port=None, remote_port=0): """Create a console for a domain. """ console = self.consoleCF.getControllerByDom(dom) if console is None: - console = self.consoleCF.createController(dom, console_port) + console = self.consoleCF.createController(dom, console_port, + remote_port=remote_port) return console def consoles(self): diff --git a/tools/python/xen/xend/server/channel.py b/tools/python/xen/xend/server/channel.py index 4c6dbadd17..57861b626a 100755 --- a/tools/python/xen/xend/server/channel.py +++ b/tools/python/xen/xend/server/channel.py @@ -45,7 +45,7 @@ class ChannelFactory: del self.channels[idx] self.notifier.unbind(idx) - def domChannel(self, dom): + def domChannel(self, dom, remote_port=0): """Get the channel for the given domain. Construct if necessary. @@ -55,7 +55,7 @@ class ChannelFactory: """ chan = self.getDomChannel(dom) if not chan: - chan = Channel(self, dom) + chan = Channel(self, dom, remote_port=remote_port) self.addChannel(chan) return chan @@ -91,10 +91,10 @@ class ChannelFactory: """ self.delChannel(channel.idx) - def createPort(self, dom): + def createPort(self, dom, remote_port=0): """Create a port for a channel to the given domain. """ - return xu.port(dom) + return xu.port(dom, remote_port) def channelFactory(): """Singleton constructor for the channel factory. @@ -200,7 +200,7 @@ class Channel(BaseChannel): are multiplexed over the channel (console, block devs, net devs). """ - def __init__(self, factory, dom): + def __init__(self, factory, dom, remote_port=0): """Create a channel to the given domain using the given factory. Do not call directly, use domChannel on the factory. @@ -209,7 +209,7 @@ class Channel(BaseChannel): # Domain. self.dom = int(dom) # Domain port (object). - self.port = self.factory.createPort(dom) + self.port = self.factory.createPort(dom, remote_port=remote_port) # Channel port (int). self.idx = self.port.local_port # Registered devices. diff --git a/tools/python/xen/xend/server/console.py b/tools/python/xen/xend/server/console.py index 666ffca2ff..3d302dbe3f 100755 --- a/tools/python/xen/xend/server/console.py +++ b/tools/python/xen/xend/server/console.py @@ -81,13 +81,14 @@ class ConsoleControllerFactory(controller.ControllerFactory): """Factory for creating console controllers. """ - def createController(self, dom, console_port=None): + def createController(self, dom, console_port=None, remote_port=0): if console_port is None: console_port = CONSOLE_PORT_BASE + dom for c in self.getControllers(): if c.console_port == console_port: raise XendError('console port in use: ' + str(console_port)) - console = ConsoleController(self, dom, console_port) + console = ConsoleController(self, dom, console_port, + remote_port=remote_port) self.addController(console) log.info("Created console id=%s domain=%d port=%d", console.idx, console.dom, console.console_port) @@ -111,8 +112,9 @@ class ConsoleController(controller.Controller): STATUS_CONNECTED = 'connected' STATUS_LISTENING = 'listening' - def __init__(self, factory, dom, console_port): - controller.Controller.__init__(self, factory, dom) + def __init__(self, factory, dom, console_port, remote_port=0): + controller.Controller.__init__(self, factory, dom, + remote_port=remote_port) self.addMethod(CMSG_CONSOLE, 0, None) self.status = self.STATUS_NEW self.addr = None diff --git a/tools/python/xen/xend/server/controller.py b/tools/python/xen/xend/server/controller.py index 3721b9b3b3..35be718631 100755 --- a/tools/python/xen/xend/server/controller.py +++ b/tools/python/xen/xend/server/controller.py @@ -68,7 +68,7 @@ class CtrlMsgRcvr: @type responders: {int:Responder} """ - def __init__(self): + def __init__(self, remote_port = 0): self.channelFactory = channel.channelFactory() self.majorTypes = {} self.dom = None @@ -76,6 +76,7 @@ class CtrlMsgRcvr: self.idx = None self.responders = {} self.timeout = 10 + self.remote_port = remote_port def setTimeout(self, timeout): self.timeout = timeout @@ -217,7 +218,8 @@ class CtrlMsgRcvr: channel to our domain. Once we have registered, the channel will call requestReceived or responseReceived for our messages. """ - self.channel = self.channelFactory.domChannel(self.dom) + self.channel = self.channelFactory.domChannel(self.dom, + self.remote_port) self.idx = self.channel.getIndex() if self.majorTypes: self.channel.registerDevice(self.getMajorTypes(), self) @@ -362,8 +364,8 @@ class Controller(CtrlMsgRcvr): @type idx: String """ - def __init__(self, factory, dom): - CtrlMsgRcvr.__init__(self) + def __init__(self, factory, dom, remote_port=0): + CtrlMsgRcvr.__init__(self, remote_port=remote_port) self.factory = factory self.dom = int(dom) self.channel = None -- 2.30.2